package com.boodaba.todocarts.test.domain;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.Before;
import org.junit.Test;

import com.boodaba.todocarts.domain.Label;
import com.boodaba.todocarts.domain.Todo;

public class LabelShould {
	
	private Label SUT1;
	private Label SUT2;
	
	
	private final String mTodoTitle1 = "have to do something";
	private final String mTodoTitle2 = "have to do another thing";
	private final String mTodoTitle3 = "have to do something else";
	
	private final String mLabelTitle1 = "some title";
	private final String mLabelTitle2 = "another title";
	
	@Before
	public void setUp() throws Exception {
		SUT1 = new Label(mLabelTitle1);
		SUT2 = new Label(mLabelTitle2);
	}
	
	@Test
	public void beIdenticalByTitle() {
				
		assertFalse(SUT1.identicalTo(null));
		assertFalse(SUT1.identicalTo(SUT2));
		assertFalse(SUT2.identicalTo(SUT1));
		
		SUT2.setTitle(mLabelTitle1);
		
		assertTrue(SUT1.identicalTo(SUT2));
		assertTrue(SUT2.identicalTo(SUT1));
	}
	
	@Test
	public void addTodo() {
		SUT1.inviteTodo(new Todo(mTodoTitle1));
		SUT1.inviteTodo(mTodoTitle2);
		
		List<Todo> listTodos = SUT1.getAllTodos();
		
		assertTrue(listTodos.size() == 2
				&& listTodos.get(0).getTitle().equals(mTodoTitle1)
				&& listTodos.get(1).getTitle().equals(mTodoTitle2));
	}
	
	@Test
	public void completeTodo() {
		SUT1.inviteTodo(new Todo(mTodoTitle2));
		SUT1.inviteTodo(mTodoTitle1);
		
		SUT1.completeTodo(new Todo(mTodoTitle1));
		
		List<Todo> listTodos = SUT1.getAllTodos();
		
		assertTrue(!listTodos.get(0).isCompleted());
		assertTrue(listTodos.get(1).isCompleted());
		
		SUT1.completeTodo(mTodoTitle2);
		
		listTodos = SUT1.getAllTodos();
		
		assertTrue(listTodos.get(0).isCompleted());
		assertTrue(listTodos.get(1).isCompleted());
	}
	
	@Test
	public void removeTodo() {
		SUT1.inviteTodo(mTodoTitle1);
		SUT1.inviteTodo(new Todo(mTodoTitle2));
		SUT1.inviteTodo(mTodoTitle3);
		
		assertTrue(SUT1.getAllTodos().size() == 3);
		
		SUT1.removeTodo(new Todo(mTodoTitle1));
		
		assertTrue(SUT1.getAllTodos().size() == 2);
		
		SUT1.removeTodo(mTodoTitle2);
		
		assertTrue(SUT1.getAllTodos().size() == 1);
		
		SUT1.removeTodo(mTodoTitle1);
		
		assertTrue(SUT1.getAllTodos().size() == 1);
	}
	
	@Test
	public void testLabelReinviteTodo() {
		SUT1.inviteTodo(new Todo(mTodoTitle1));
		SUT1.inviteTodo(mTodoTitle2);
		SUT1.inviteTodo(new Todo(mTodoTitle3));
		
		assertTrue(SUT1.getAllTodos().size() == 3);
		
		SUT1.inviteTodo(mTodoTitle1);
		SUT1.inviteTodo(new Todo(mTodoTitle2));
		SUT1.inviteTodo(mTodoTitle2);
		SUT1.inviteTodo(new Todo(mTodoTitle3));
		
		assertTrue(SUT1.getAllTodos().size() == 3);
		
		SUT1.completeTodo(mTodoTitle1);
		SUT1.completeTodo(new Todo(mTodoTitle3));
		
		assertTrue(SUT1.getAllTodos().get(0).isCompleted());
		assertTrue(SUT1.getAllTodos().get(2).isCompleted());
		
		SUT1.inviteTodo(mTodoTitle1);
		SUT1.inviteTodo(new Todo(mTodoTitle3));
		
		assertTrue(!SUT1.getAllTodos().get(0).isCompleted());
		assertTrue(!SUT1.getAllTodos().get(2).isCompleted());
	}
	
	@Test
	public void rejectNullTodoSilently() {
		SUT1.inviteTodo((Todo)null);
		SUT1.inviteTodo((String)null);
		
		assertTrue(SUT1.getAllTodos().size() == 0);
	}
}
